#include <stdio.h>

// wezly
typedef int node;
node nullNode; // element pusty
void nodestab_print(node* , int , int ); // wydruk

// wyszukiwanie
#define key(A) (A) // wyznaczony klucz
#define less(A, B) (A < B) // porownywanie kluczy
#define exch(A, B) { node t = A; A = B; B = t; } // zamiana wezlow
#define compexch(A, B) if (less(B, A)) exch(A, B) // zamiana z porownaniem
#define eq(A, B) (!less(A, B) && !less(B, A))
#define maxKey 64
node *st; // tablica symboli
void st_init(); // inicjowanie ts
void st_insert(node ); // wstawianie do ts
node st_search(int ); // wyszukiwanie wezla o podanym kluczu w ts
void st_remove(node );

int main() 
{ 
  int i;
  int nnr;
  nullNode = -1; // element pusty;
  node nodestab[] = {1, 3, 4, 15, 45, 32, 56, 67}; // tablica elementow
  nnr = sizeof nodestab / sizeof(node ); // liczba elementow
  st_init(nnr); // inicjowanie tablicy symboli
  for(i = 0; i < nnr; i++) // loop for insertion 
    st_insert(nodestab[i]); 
  printf("%i\n", st_search(45)); // wyszukiwanie klucza 45
  st_remove(45);
  printf("%i\n", st_search(45)); // wyszukiwanie klucza 45
  return 0;
}

// funkcje dla wezlow
void nodestab_print(node a[], int l, int r)
{
  int i;
  int x;
  for (i = l; i < r; i++) {
    x = a[i]; 
    printf("%i ", x);
  }
  printf("\n");
}

// funkcje dla wyszukiwania
void st_init() 
{ 
  int i;
  st = (node*)malloc((maxKey+1)*sizeof(node ));
  for (i = 0; i <= maxKey; i++)
    st[i] = nullNode;
}

void st_insert(node item)
{ 
  st[key(item)] = item;
}

void st_remove(node item)
{
  st[key(item)] = nullNode;
}

node st_search(int v)
{ 
  return st[v];
}
